home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / round4.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  5KB  |  232 lines

  1. /* 回転4枚羽 */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12. #include "../entry.h"
  13.  
  14. #define PALET_MAIN    0x0800
  15.  
  16. #define HP_0    180
  17. #define SHOT_SPEED        7
  18.  
  19. static short EnemyMoveRound4 (ENEMY *);
  20. static void EnemyTiniRound4 (ENEMY *);
  21.  
  22. enum {
  23.     APPEAR_LEFT = 0, APPEAR_RIGHT
  24. };
  25.  
  26. #define ENTRY_CONTROL_ADD    10    /* entry_control に足す値 */
  27.  
  28.  
  29. void EnemyInitRound4 (ENEMY * p)
  30. {
  31.     if (SHORT_LX < 144) {
  32.         p->cwork = APPEAR_LEFT;
  33.         p->vx = 5 * 65536;
  34.     } else {
  35.         p->cwork = APPEAR_RIGHT;
  36.         p->vx = -5 * 65536;
  37.     }
  38.     p->vy = -(3 << 16);
  39.     p->hit_px = 24;
  40.     p->hit_py = 16;
  41.     p->hit_sx = 24;
  42.     p->hit_sy = 16;
  43.     p->hit_cx = 6;
  44.     p->damage = 0;
  45.     p->flash = 0;
  46.     p->hp = HP_0;
  47.     p->pt = obj_round4 + 25;
  48.     p->seq = 0;
  49.     p->work2 = 0;
  50.     p->m_work3 = 0;        /* 回転角(8+8bit 固定小数点) */
  51.     p->m_work4 = 2 << 8;    /* 回転角の速度 */
  52.  
  53.     p->core_pt = sp_core01;
  54.     p->core_info = PALET_CORE_RED | PRIORITY_BOSS;
  55.     p->func_enemy_move = EnemyMoveRound4;
  56.     p->func_enemy_tini = EnemyTiniRound4;
  57.  
  58.     entry_control += ENTRY_CONTROL_ADD;
  59. }
  60.  
  61.  
  62.  
  63. static short EnemyMoveRound4 (ENEMY * p)
  64. {
  65.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  66.     p->x = (p->lx += p->vx) >> 16;
  67.     p->y = (p->ly += p->vy) >> 16;
  68.  
  69.     switch (p->seq) {
  70.     case 0:
  71.         /* 移動処理 */
  72.         if (p->cwork == APPEAR_LEFT)
  73.             if (p->vx > 0)
  74.                 p->vx -= 4096;
  75.             else
  76.                 p->vx = 0;
  77.         else if (p->vx < 0)
  78.             p->vx += 4096;
  79.         else
  80.             p->vx = 0;
  81.         if (SHORT_VY < 0)
  82.             p->vy += 4096;
  83.  
  84.         /* 回転処理 */
  85.         p->m_work3 += p->m_work4;
  86.         if (p->m_work4 > 64)
  87.             p->m_work4 -= 4;
  88.         p->pt = obj_round4 + 25 + *(char *) (&p->m_work3);
  89.         if (p->m_work3 > (8 << 8)) {
  90.             p->m_work3 -= (8 << 8);
  91.             p->pt = obj_round4 + 25;
  92.             if (p->m_work4 < 192) {
  93.                 /* 回転数が落ちてほとんど停止したら次の段階へ移行 */
  94.                 p->seq++;
  95.                 p->vx = 0;
  96.                 p->pt = obj_round4;
  97.             }
  98.         }
  99.         break;
  100.  
  101.     case 1:        /* 羽を開く */
  102.         p->pt++;
  103.         if (p->pt == obj_round4 + 13)
  104.             SoundSetSE (SE_LOCK);    /* 「がちゃん」という効果音を鳴らす */
  105.  
  106.         if (p->pt > obj_round4 + 23) {
  107.             p->seq++;
  108.             p->s_work = p->s_work2 = p->s_work3 = 0;
  109.             p->s_angle = 64;
  110.             p->m_work3 = 0;    /* 回転角(8+8bit固定小数点) */
  111.             p->m_work4 = 16;    /* 回転角加速度 */
  112.             if (p->x > player->x)    /* この時点で自機をサーチ */
  113.                 p->cwork2 = !0;
  114.             else
  115.                 p->cwork2 = 0;
  116.         }
  117.         break;
  118.  
  119.     case 2:        /* 開いた状態で回転 */
  120.         /* 移動処理 */
  121.         if (p->vy < 65536)
  122.             p->vy += 4096;
  123.  
  124.         /* 回転処理 */
  125.         p->m_work3 += p->m_work4;
  126.         if (p->m_work4 < 256)
  127.             p->m_work4 += 4;
  128.         else
  129.             p->m_work4 = 256;
  130.         if (p->m_work3 > (8 << 8))
  131.             p->m_work3 -= (8 << 8);
  132.         p->pt = obj_round4 + 25 + 9 + *(char *) (&p->m_work3);
  133.  
  134.         /* 攻撃処理 */
  135.         switch (p->s_work) {
  136.         case 0:
  137.             if (p->s_work2++ > 20) {
  138.                 p->s_work++;
  139.                 p->s_work2 = 0;
  140.             }
  141.             break;
  142.  
  143.         case 1:
  144. #define INTERVAL2_1    7
  145. #define SPEED_SHOT2    8
  146.             if (p->s_work2++ > INTERVAL2_1) {
  147.                 char a = p->s_angle;
  148.                 p->s_work2 = 0;
  149.                 EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT2, a+64*0, 2);
  150.                 EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT2, a+64*1, 2);
  151.                 EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT2, a+64*2, 2);
  152.                 EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT2, a+64*3, 2);
  153.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  154.                 p->s_angle+=12;
  155.                 if (p->s_work3++ == 8)
  156.                     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  157.                 if (p->s_work3 > 10)
  158.                     p->seq++;
  159.             }
  160.             break;
  161.         }
  162.         break;
  163.  
  164.     case 3:        /* 上昇して逃げる */
  165.         /* 移動処理 */
  166.         if (p->vy > -65536)
  167.             p->vy -= 4096;
  168.  
  169.         /* 回転処理 */
  170.         p->m_work3 += p->m_work4;
  171.         if (p->m_work4 < 256)
  172.             p->m_work4 += 4;
  173.         else
  174.             p->m_work4 = 256;
  175.         if (p->m_work3 > (8 << 8))
  176.             p->m_work3 -= (8 << 8);
  177.         p->pt = obj_round4 + 25 + 9 + *(char *) (&p->m_work3);
  178.         break;
  179.     }
  180.  
  181.     /* 画面外に出たら消去 */
  182.     if (SHORT_LY < -48)
  183.         return (-1);    /* 消去 */
  184.  
  185.  
  186.     /* 自機ショットに当たった時の処理 */
  187.     if (p->damage) {
  188.         if (p->damage_core) {
  189.             SoundSetSE (SE_CORE_DAMAGE);
  190.             p->info = PALET_RED | PRIORITY_BOSS;
  191.             p->damage_core = 0;
  192.         } else {
  193.             SoundSetSE (SE_DAMAGE);
  194.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  195.         }
  196.         if ((p->hp -= p->damage) <= 0) {
  197.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  198.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  199.             if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS))
  200.                 EffectInit (EFFECT_POINTS_RED, POINTS_1200, p->x, p->y);
  201.             else
  202.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_700, p->x, p->y);
  203.             if (disp_level == DISP_LEVEL_HIGH)
  204.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  205.  
  206.             return (-1);    /* 消去 */
  207.         }
  208.         p->damage = 0;
  209.         p->flash = TIMER_FLASH_DAMAGE;
  210.     } else {
  211.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 80)) {
  212.             p->info = PALET_RED | PRIORITY_BOSS;
  213.             if (p->flash > TIMER_FLASH_NORMAL)
  214.                 p->flash = 0;
  215.         } else {
  216.             p->info = PALET_MAIN | PRIORITY_BOSS;
  217.         }
  218.     }
  219.     xobj_set_st (p);
  220.  
  221.     /* コアの表示 */
  222.     p->core_x = p->x - 8;    /* コアの中心は (-8,-8) ドットずれる */
  223.     p->core_y = p->y - 8;
  224.     xsp_set_st (&(p->core_x));
  225.  
  226.     return (0);
  227. }
  228. static void EnemyTiniRound4 (ENEMY * p)
  229. {
  230.     entry_control -= ENTRY_CONTROL_ADD;
  231. }
  232.